package com.jml.字节码技术.javaasist;

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.NotFoundException;

import java.lang.reflect.Method;

public class 动态修改字节码文件 {

    public static void main(String[] args) throws Exception {
        ClassPool pool = ClassPool.getDefault();
        //读取当前工程中的java文件
        CtClass userClass = pool.get("com.jml.字节码技术.javaasist.User");
        //第一个参数是返回值类型,add是方法名字，后面是方法中参数类型。
        CtMethod ctMethod = new CtMethod(CtClass.voidType, "add", new CtClass[] { CtClass.intType, CtClass.intType },
                userClass);
        //$1表示第一个参数，$2表示第二个参数
        ctMethod.setBody(" {System.out.println(\"执行了a:\"+$1+\"  b:\"+$2);}");
        userClass.addMethod(ctMethod);
        userClass.writeFile("D:");
        //动态执行方法
        Class clazz = userClass.toClass();
        Object instance = clazz.newInstance();
        Method declaredMethod = clazz.getDeclaredMethod("add", int.class, int.class);
        declaredMethod.invoke(instance,1,2);
    }


}
